#include "tporo.h"
#include <iostream>
#include <cstring>
#include <string>
#include <cctype>

using namespace std;

ostream& operator<<(ostream& os, const TPoro& p)
{
   TPoro cero;

   if (p == cero)
   {
      os << "()";
   }
   else
   {
     os.setf(ios::fixed);
      os.precision(2);

      os << "(" << p.x << ", " << p.y << ") "  << p.volumen;
      if (NULL == p.color)
      {
         os << " -";
      }
      else
      {
         string s=p.color;
         string out="";
         for(int i=0; i<(signed)s.length(); i++)
         {
            out+=tolower(s[i]);
         }
         os << " " << out;
      }
   }
   return os;
}



TPoro::TPoro()
{
   x = 0;
   y = 0;
   volumen = 0;
   color = NULL;
}

TPoro::TPoro(int px, int py, double pvolumen)
{
   x=px;
   y=py;
   volumen=pvolumen;
   color = NULL;
}


TPoro::TPoro(int px, int py, double pvolumen, char* pcolor)
{
      x=px;
      y=py;
      volumen=pvolumen;
      if(pcolor == NULL)
      {
         color = NULL;
      }
      else
      {
         string s=pcolor;
         string out="";
         for(int i=0; i<(signed)s.length(); i++)
         {
			 out+=tolower(s[i]);
         }
         color = new char[strlen(pcolor) + 1];
         strcpy(color, out.c_str());
      }
}

//Constructor de Copia
TPoro::TPoro(const TPoro& p)
{
      //~ (*this).~TPoro();
      x=p.x;
      y=p.y;
      volumen=p.volumen;
      if(p.color == NULL)
   {
      color = NULL;
   }
   else
   {
      color = new char[strlen(p.color) + 1];
      strcpy(color, p.color);
   }
}


TPoro::~TPoro()
{

   x = 0;
   y = 0;
   volumen = 0;
   delete[] color;
   color = NULL;

  /* x = 0;
   y = 0;
   volumen = 0;

      delete color;
   color = NULL;*/
}


TPoro& TPoro::operator=(const TPoro & p)
{
   if (this != &p)
   {
      (*this).~TPoro();
      x = p.x;
      y = p.y;
      volumen = p.volumen;
      if(p.color == NULL)
      {
         color = NULL;
      }
      else
      {
         color = new char[strlen(p.color) + 1];
         strcpy(color, p.color);
      }
   }
   return *this;
}

bool TPoro::operator==(const TPoro& p) const
{
   bool iguales = false;
   if(x == p.x && y == p.y && volumen == p.volumen )
   {
      if(color != NULL && p.color != NULL)
      {
         if(strcmp(color, p.color) == 0)
            iguales = true;
      }
      else
      {
         if(color == NULL && p.color == NULL)
            iguales = true;
      }
   }
   return iguales;
}

bool TPoro::operator!=(const TPoro& p) const
{
   bool distinto = true;
   if((*this)==p)
   {
         distinto = false;
   }
   return distinto;
}

void TPoro::Posicion(int px, int py)
{
   x = px;
   y = py;
}


void TPoro::Volumen(double pvolumen)
{
   volumen = pvolumen;
}


void TPoro::Color(char* const pcolor)
{
   if(pcolor == NULL)
      color = NULL;
   else
   {
       string s=pcolor;
   string out="";
      for(int i=0; i<(signed)s.length(); i++)
        {
         out+=tolower(s[i]);
         }
   color = new char[strlen(pcolor) + 1];
   strcpy(color, out.c_str());
   }
}


int TPoro::PosicionX() const
{
   return x;
}


int TPoro::PosicionY() const
{
   return y;
}


double TPoro::Volumen() const
{
   return volumen;
}


char* TPoro::Color() const
{
   return color;
}

bool TPoro::EsVacio() const
{
   bool vacio = false;
   TPoro pvacio;
   if((*this)==pvacio)
      vacio=true;
   return vacio;
}

bool TPoro::VolMayor(const TPoro p) const
{
	bool mayor = true;
	if( volumen <= p.volumen)
	{
		mayor = false;
	}
	return mayor;
}

